#!/bin/sh

# This is a helper script that rotate image files according to the metadata
# requirements: ImageMagick, exiftran, exiv2

GQ_METADATA_DIR="$HOME/.local/share/geeqie/metadata"

rotate()
{
    ext=`echo "${1##*.}" |tr "[:upper:]" "[:lower:]"`
    [ "x$ext" = "x" ] && return 1 #no extension

    gq_metadata="$GQ_METADATA_DIR/$1.gq.xmp"
    if [ -f "$gq_metadata" ] ; then
		gq_orientation=`exiv2 -PXkv "$gq_metadata"|grep Xmp.tiff.Orientation|sed -e "s|Xmp.tiff.Orientation *||"`
		[ $? != 0 ] && exit 1
    else
		gq_orientation=
    fi

    case "$ext" in
	jpg|jpeg) 
		if [ -n "$gq_orientation" ] ; then
			exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
			[ $? != 0 ] && exit 1
		fi
		if exiftran -aip "$1" ; then
		    # exiftran ignores xmp, set it manually
		    exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
			[ $? != 0 ] && exit 1
		    #http://dev.exiv2.org/issues/show/639
			if [ -n "$gq_orientation" ] ; then
				exiv2 -M "set Xmp.tiff.Orientation 1" \
								-M "set Exif.Image.Orientation 1" "$gq_metadata"
				[ $? != 0 ] && exit 1
			fi
		    return 0
		else
			exit 1
		fi
		;;
	
	tif|tiff|png)
		if [ -n "$gq_orientation" ] ; then
			exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
			[ $? != 0 ] && exit 1
		fi
		if mogrify -auto-orient "$1" ; then
		    # mogrify ignores xmp, set it manually
		    exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
			[ $? != 0 ] && exit 1
		    #http://dev.exiv2.org/issues/show/639
			if [ -n "$gq_orientation" ] ; then
				exiv2 -M "set Xmp.tiff.Orientation 1" \
								-M "set Exif.Image.Orientation 1" "$gq_metadata"
				[ $? != 0 ] && exit 1
			fi
		    return 0
		else
			exit 1
		fi
		;;
	*)	#not supported
		return 4
		;;
    esac
}

rotate_image_file()
{
	ext=`echo "${3##*.}" |tr "[:upper:]" "[:lower:]"`
	[ "x$ext" = "x" ] && return 1 #no extension

	case "$ext" in
	jpg|jpeg)
		exiftran -i "$1" "$3"
		[ $? != 0 ]  && return 6
		return 0;
		;;

	tif|tiff|png)
		mogrify $2 "$3"
		[ $? != 0 ]  && return 7
		return 0;
		;;

	*)	#not supported
		return 4
		;;
	esac
}

get_sidecars=
if [ "x$1" = "x-g" ] ; then
    get_sidecars=yes
    shift
fi

rotate_image_file=
rotation=
if [ "x$1" = "x-r" ] ; then
	rotate_image_file=yes
	shift
	rotation="$1"
	shift
fi

preserve_mtime=
if [ "x$1" = "x-t" ] ; then
	preserve_mtime=yes
	shift
fi

if [ -n "$rotation" ] ; then
	if [ "x$rotation" = "x0" ] ; then
		exit 0
	fi
	if [ "x$rotation" = "x2" ] ; then
		mogrify_param="-flop"
		exiftran_param="-F"
	fi
	if [ "x$rotation" = "x3" ] ; then
		mogrify_param="-rotate 180"
		exiftran_param="-1"
	fi
	if [ "x$rotation" = "x4" ] ; then
		mogrify_param="-flip"
		exiftran_param="-f"
	fi
	if [ "x$rotation" = "x5" ] ; then
		mogrify_param="-transpose"
		exiftran_param="-t"
	fi
	if [ "x$rotation" = "x6" ] ; then
		mogrify_param="-rotate 90"
		exiftran_param="-9"
	fi
	if [ "x$rotation" = "x7" ] ; then
		mogrify_param="-transverse"
		exiftran_param="-T"
	fi
	if [ "x$rotation" = "x8" ] ; then
		mogrify_param="-rotate -90"
		exiftran_param="-2"
	fi
fi

# iterate over files on commandline
for file in "$@" ; do
    if [ -n "$get_sidecars" ] ; then
        # we got only one file for each group, typically the main one
        # get the sidecars:
        geeqie -r --get-sidecars:"$file" |while read sidecar ; do
            # the main file is included in the sidecar file list, no special handling is required
			[ ! -w "$sidecar" ] && exit 5
            rotate "$sidecar"
			ret=$?
        done
		# Bourne shell runs DO loops in a sub-shell
		ret=$?
		[ $ret != 0 ] && exit $ret
    else
		[ ! -w "$file" ] && exit 5
		if [ -n "$rotate_image_file" ] ; then
			if [ -n "$preserve_mtime" ] ; then
				mtime=`mktemp /tmp/geeqie-rotate.XXXXXXXXXX` || exit 3
				touch --reference="$file" "$mtime"
			fi

			rotate_image_file "$exiftran_param" "$mogrify_param" "$file"
			ret=$?

			if [ -n "$preserve_mtime" ] ; then
				touch --reference="$mtime" "$file"
				rm "$mtime"
			fi
			[ $ret != 0 ]  && exit $ret
		else
			rotate "$file"
			ret=$?
			[ $ret != 0 ] && exit $ret
		fi
    fi
done

exit 0
